#ifndef VDSADAPTER_H
#define VDSADAPTER_H

#include <QVector>
#define MAX_WAVE_SIZE 1000

typedef struct { quint64 value; char key[8]; } AdapterData;
typedef QVector<const AdapterData *> AdapterTable;

class VdsAdapterPrivate;
class VdsAdapter
{
public:
    VdsAdapter();
    ~VdsAdapter();

    /**
     * @brief timebaseScale 计算最匹配的时基档位
     * @param pulseWidth 脉冲宽度
     * @return 最合适的时基档位
     */
    QString timebaseScale(int pulseWidth);

    /**
     * @brief timebaseOffset 计算时基偏移格数
     * @return 时基偏移格数
     */
    QString timebaseOffset();

    /**
     * @brief VdsAdapter::voltageScale 计算最匹配的电压档位
     * @param testVoltage 测试电压，单位：V
     * @param probeRate 探头倍率
     * @return 最合适的电压档位
     */
    QString voltageScale(int testVoltage, int probeRate);

    /**
     * @brief voltageOffset 计算电压偏移格数
     * @return 电压偏移格数
     */
    QString voltageOffset();

    /**
     * @brief VdsAdapter::triggleLevel 计算触发电平偏移格数
     * @param triggerVoltage 设置的触发电压，单位：V
     * @param probeRate 探头倍率
     * @param voltageScale 当前的电压档位
     * @return 触发电平偏移格数
     */
    QString triggleLevel(double triggerVoltage, int probeRate, const QString &voltageScale);

    /**
     * @brief timebaseScaleRange 获取时基档位
     * @return 时基档位列表
     */
    AdapterTable timebaseScaleRange();

    /**
     * @brief voltageScaleMeasureRange 获取电压测量档位范围
     * @return 测量电压档位列表
     */
    AdapterTable voltageScaleMeasureRange();

    /**
     * @brief voltageScaleDisplayRange 获取电压显示档位范围(显示档位 = 测量档位 * probeRate)
     * @param probeRate 探头倍率
     * @return 显示电压档位列表
     */
    AdapterTable voltageScaleDisplayRange(int probeRate);

    /**
     * @brief voltageScaleDisplay2Measure 电压显示档位 -> 电压测量档位
     * @param voltageScale 电压显示档位
     * @param probeRate 探头倍率
     * @return 电压测量档位
     */
    QString voltageScaleDisplay2Measure(const QString &voltageScale, int probeRate);

    /**
     * @brief voltageScaleMeasure2Display 电压测量档位 -> 电压显示档位
     * @param voltageScale 电压测量档位
     * @param probeRate 探头倍率
     * @return 电压显示档位
     */
    QString voltageScaleMeasure2Display(const QString &voltageScale, int probeRate);

    /**
     * @brief sampleTime 获取时基档位采样时间
     * @param pulseWidth 脉冲宽度
     * @return 采样时间，单位：μs
     */
    double sampleTime(int pulseWidth);

private:
    VdsAdapterPrivate *d;
};

#endif // VDSADAPTER_H
